
// Copyright (c) 2009 Mohannad Alharthi (mohannad.harthi@gmail.com)
// All rights reserved.
// This source code is licensed under the BSD license, which can be found in
// the LICENSE.txt file.

#ifndef INCLUDE_CCOMPX_SRC_FORMAT_H__
#define INCLUDE_CCOMPX_SRC_FORMAT_H__

#include <iostream>
#include <cstdarg>
#include <string>
#include <sstream>

//#define wformat __format<wchar_t>
//#define format __format<char>

std::string format(std::string format_str, ...) {
  va_list arg_list;
  va_start(arg_list, format_str);

  char buffer[256];
  vsprintf(buffer, format_str.c_str(), arg_list);
  va_end(arg_list);

  return std::string(buffer);
}

// A simple string formatting function
//template<typename _Elem>
//std::basic_string<_Elem> __format(std::basic_string<_Elem> format_str, ... ) {
//  va_list arg_list;
//  va_start(arg_list, format_str);
//  
//  int int_arg;
//  const _Elem* c_str_arg;
//  std::basic_string<_Elem> str_arg;
//
//  std::basic_stringstream<_Elem> string_stream;
//  std::basic_string<_Elem>::iterator it;
//
//  for (it = format_str.begin(); it != format_str.end(); it++) {
//    if (*it != static_cast<_Elem>('%')) {
//      string_stream << *it;
//      continue;
//    }
//
//    if (it == format_str.end() - 1) {
//      string_stream << *it;
//      break;
//    }
//
//    switch (*(++it)) {
//    case (static_cast<_Elem>('s')):
//      c_str_arg = va_arg(arg_list, _Elem*);
//      string_stream << c_str_arg;
//      break;
//    case (static_cast<_Elem>('S')):
//      str_arg = va_arg(arg_list, std::basic_string<_Elem>);
//      string_stream << str_arg;
//      break;
//    case (static_cast<_Elem>('d')):
//      int_arg = va_arg(arg_list, int);
//      string_stream << int_arg;
//      break;
//    default:
//      string_stream << static_cast<_Elem>('%') << *it;
//      break;
//    }
//  }
//
//  va_end(arg_list);
//  return string_stream.str();
//}

} // namespace

#endif // INCLUDE_CCOMPX_SRC_FORMAT_H__
